package com.school.sports.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.school.sports.entity.Volunteer;
import com.school.sports.entity.VolunteerApplication;
import com.school.sports.entity.VolunteerTask;

import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * 志愿者服务接口
 */
public interface VolunteerService {

    // ==================== 志愿者申请管理 ====================

    /**
     * 提交志愿者申请
     * @param application 申请信息
     * @return 申请结果
     */
    boolean submitApplication(VolunteerApplication application);

    /**
     * 审核志愿者申请
     * @param applicationId 申请ID
     * @param approved 是否通过
     * @param reviewComment 审核意见
     * @param reviewerId 审核人ID
     * @return 审核结果
     */
    boolean reviewApplication(Long applicationId, boolean approved, String reviewComment, Long reviewerId);

    /**
     * 取消志愿者申请
     * @param applicationId 申请ID
     * @param cancelReason 取消原因
     * @return 取消结果
     */
    boolean cancelApplication(Long applicationId, String cancelReason);

    /**
     * 分页查询志愿者申请列表
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param application 查询条件
     * @return 分页结果
     */
    IPage<VolunteerApplication> getApplicationPage(Integer currentPage, Integer pageSize, VolunteerApplication application);

    /**
     * 获取用户申请列表
     * @param userId 用户ID
     * @return 申请列表
     */
    List<VolunteerApplication> getApplicationsByUserId(Long userId);

    /**
     * 获取待审核申请数量
     * @return 待审核数量
     */
    int getPendingApplicationCount();

    // ==================== 志愿者任务分配 ====================

    /**
     * 分配志愿者任务
     * @param task 任务信息
     * @return 分配结果
     */
    boolean assignTask(VolunteerTask task);

    /**
     * 批量分配志愿者任务
     * @param tasks 任务列表
     * @return 分配结果
     */
    boolean batchAssignTasks(List<VolunteerTask> tasks);

    /**
     * 更新任务状态
     * @param taskId 任务ID
     * @param status 任务状态
     * @return 更新结果
     */
    boolean updateTaskStatus(Long taskId, String status);

    /**
     * 开始执行任务
     * @param taskId 任务ID
     * @return 执行结果
     */
    boolean startTask(Long taskId);

    /**
     * 完成任务
     * @param taskId 任务ID
     * @param feedback 任务反馈
     * @return 完成结果
     */
    boolean completeTask(Long taskId, String feedback);

    /**
     * 取消任务
     * @param taskId 任务ID
     * @param cancelReason 取消原因
     * @return 取消结果
     */
    boolean cancelTask(Long taskId, String cancelReason);

    /**
     * 分页查询志愿者任务列表
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param task 查询条件
     * @return 分页结果
     */
    IPage<VolunteerTask> getTaskPage(Integer currentPage, Integer pageSize, VolunteerTask task);

    /**
     * 获取志愿者任务列表
     * @param volunteerId 志愿者ID
     * @return 任务列表
     */
    List<VolunteerTask> getTasksByVolunteerId(Long volunteerId);

    /**
     * 获取进行中的任务列表
     * @return 任务列表
     */
    List<VolunteerTask> getOngoingTasks();

    /**
     * 获取即将开始的任务（1小时内）
     * @return 任务列表
     */
    List<VolunteerTask> getUpcomingTasks();

    // ==================== 志愿者服务记录管理 ====================

    /**
     * 获取志愿者服务记录
     * @param volunteerId 志愿者ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 服务记录列表
     */
    List<VolunteerTask> getServiceRecords(Long volunteerId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 计算志愿者总服务时长
     * @param volunteerId 志愿者ID
     * @return 服务时长（小时）
     */
    Integer calculateTotalServiceHours(Long volunteerId);

    /**
     * 计算指定时间段内的服务时长
     * @param volunteerId 志愿者ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 服务时长（小时）
     */
    Integer calculateServiceHoursInRange(Long volunteerId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取志愿者服务统计信息
     * @param volunteerId 志愿者ID
     * @return 统计信息
     */
    Map<String, Object> getServiceStatistics(Long volunteerId);

    /**
     * 生成志愿者服务证书
     * @param volunteerId 志愿者ID
     * @param certificateType 证书类型
     * @return 证书信息
     */
    Map<String, Object> generateServiceCertificate(Long volunteerId, String certificateType);

    // ==================== 志愿者统计分析 ====================

    /**
     * 获取志愿者总数统计
     * @return 统计信息
     */
    Map<String, Object> getVolunteerCountStatistics();

    /**
     * 获取志愿者活跃度统计
     * @param days 统计天数
     * @return 活跃度统计
     */
    Map<String, Object> getActivityStatistics(Integer days);

    /**
     * 获取志愿者服务时长排行
     * @param limit 排行榜数量限制
     * @param timeRange 时间范围（月、季、年）
     * @return 排行榜
     */
    List<Map<String, Object>> getServiceHoursRanking(Integer limit, String timeRange);

    /**
     * 获取志愿者任务完成率统计
     * @param timeRange 时间范围
     * @return 完成率统计
     */
    Map<String, Object> getTaskCompletionRate(String timeRange);

    /**
     * 获取志愿者分布统计（按学院、班级等）
     * @param groupBy 分组字段
     * @return 分布统计
     */
    List<Map<String, Object>> getVolunteerDistribution(String groupBy);

    /**
     * 获取志愿者服务类型统计
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 服务类型统计
     */
    Map<String, Object> getServiceTypeStatistics(LocalDateTime startTime, LocalDateTime endTime);

    // ==================== 志愿者评价管理 ====================

    /**
     * 评价志愿者任务表现
     * @param taskId 任务ID
     * @param rating 评分等级
     * @param comment 评价内容
     * @param evaluatorId 评价人ID
     * @return 评价结果
     */
    boolean evaluateTask(Long taskId, String rating, String comment, Long evaluatorId);

    /**
     * 批量评价任务
     * @param evaluations 评价列表（包含任务ID、评分、评价内容等）
     * @return 评价结果
     */
    boolean batchEvaluateTasks(List<Map<String, Object>> evaluations);

    /**
     * 获取志愿者平均评分
     * @param volunteerId 志愿者ID
     * @return 平均评分
     */
    Double getAverageRating(Long volunteerId);

    /**
     * 获取志愿者评价记录
     * @param volunteerId 志愿者ID
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @return 评价记录
     */
    IPage<Map<String, Object>> getEvaluationRecords(Long volunteerId, Integer currentPage, Integer pageSize);

    /**
     * 获取优秀志愿者列表
     * @param limit 数量限制
     * @param minRating 最低评分要求
     * @return 优秀志愿者列表
     */
    List<Volunteer> getOutstandingVolunteers(Integer limit, Double minRating);

    // ==================== 志愿者工作负载管理 ====================

    /**
     * 检查志愿者是否可以接受新任务
     * @param volunteerId 志愿者ID
     * @return 是否可以接受
     */
    boolean canAcceptNewTask(Long volunteerId);

    /**
     * 获取志愿者当前工作负载
     * @param volunteerId 志愿者ID
     * @return 工作负载信息
     */
    Map<String, Object> getWorkload(Long volunteerId);

    /**
     * 获取可用志愿者列表（可接受新任务）
     * @param startTime 任务开始时间
     * @param endTime 任务结束时间
     * @return 可用志愿者列表
     */
    List<Volunteer> getAvailableVolunteers(LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 智能推荐志愿者
     * @param projectId 项目ID
     * @param venueId 场地ID
     * @param taskContent 任务内容
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 推荐志愿者列表
     */
    List<Volunteer> recommendVolunteers(Long projectId, Integer venueId, String taskContent,
                                       LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 检查志愿者时间冲突
     * @param volunteerId 志愿者ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 是否有时间冲突
     */
    boolean hasTimeConflict(Long volunteerId, LocalDateTime startTime, LocalDateTime endTime);

    // ==================== 志愿者资质验证 ====================

    /**
     * 验证志愿者资质
     * @param volunteerId 志愿者ID
     * @param verificationType 验证类型
     * @return 验证结果
     */
    boolean verifyVolunteerQualification(Long volunteerId, String verificationType);

    /**
     * 更新志愿者状态
     * @param volunteerId 志愿者ID
     * @param status 志愿者状态
     * @return 更新结果
     */
    boolean updateVolunteerStatus(Long volunteerId, String status);

    /**
     * 获取志愿者详细信息
     * @param volunteerId 志愿者ID
     * @return 志愿者详细信息
     */
    Volunteer getVolunteerDetails(Long volunteerId);

    /**
     * 分页查询志愿者列表
     * @param currentPage 当前页码
     * @param pageSize 每页大小
     * @param volunteer 查询条件
     * @return 分页结果
     */
    IPage<Volunteer> getVolunteerPage(Integer currentPage, Integer pageSize, Volunteer volunteer);

    /**
     * 批量更新志愿者状态
     * @param volunteerIds 志愿者ID列表
     * @param status 状态
     * @return 更新结果
     */
    boolean batchUpdateVolunteerStatus(List<Long> volunteerIds, String status);

    // ==================== 志愿者管理功能 ====================

    /**
     * 检查用户是否为志愿者
     * @param userId 用户ID
     * @return 是否为志愿者
     */
    boolean isVolunteer(Long userId);

    /**
     * 将用户注册为志愿者
     * @param userId 用户ID
     * @return 注册结果
     */
    boolean registerAsVolunteer(Long userId);

    /**
     * 获取志愿者标签
     * @param volunteerId 志愿者ID
     * @return 标签列表
     */
    List<String> getVolunteerTags(Long volunteerId);

    /**
     * 导出志愿者服务记录
     * @param volunteerId 志愿者ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param format 导出格式
     * @return 导出结果
     */
    Map<String, Object> exportServiceRecords(Long volunteerId, LocalDateTime startTime,
                                           LocalDateTime endTime, String format);

    /**
     * 发送志愿者通知
     * @param volunteerIds 志愿者ID列表
     * @param title 通知标题
     * @param content 通知内容
     * @param notificationType 通知类型
     * @return 发送结果
     */
    boolean sendNotification(List<Long> volunteerIds, String title, String content, String notificationType);

    /**
     * 获取志愿者绩效报告
     * @param volunteerId 志愿者ID
     * @param reportType 报告类型
     * @param timeRange 时间范围
     * @return 绩效报告
     */
    Map<String, Object> getPerformanceReport(Long volunteerId, String reportType, String timeRange);
}